package fieldTypePackage;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class StringField {
	private ArrayList<String> nummerLijst, gebruikersNamen, wachtwoorden, voorNamen, achterNamen,
			telefoonNummers, plaatsNamen, adressen, postcodes, emailAdressen, straatNamen,
			huisNummers, bestandRegels, gevraagdeRegels, opgegevenBestandInhoud;
	private File achterNamenBestand, voorNamenBestand, plaatsNamenBestand, straatNamenBestand;
	private int aantalRecords;

	public StringField(int aantalRecords) throws FileNotFoundException {
		this.aantalRecords = aantalRecords;
		gebruikersNamen = new ArrayList<String>();
		wachtwoorden = new ArrayList<String>();
		voorNamen = new ArrayList<String>();
		achterNamen = new ArrayList<String>();
		telefoonNummers = new ArrayList<String>();
		plaatsNamen = new ArrayList<String>();
		postcodes = new ArrayList<String>();
		emailAdressen = new ArrayList<String>();
		straatNamen = new ArrayList<String>();
		huisNummers = new ArrayList<String>();
		adressen = new ArrayList<String>();
		bestandRegels = new ArrayList<String>();
		gevraagdeRegels = new ArrayList<String>();
		opgegevenBestandInhoud = new ArrayList<String>();
		nummerLijst = new ArrayList<String>();

		achterNamenBestand = new File("dataBestanden/achternamen.txt");
		voorNamenBestand = new File("dataBestanden/voornamen.txt");
		plaatsNamenBestand = new File("dataBestanden/plaatsnamen.txt");
		straatNamenBestand = new File("dataBestanden/straatnamen.txt");
	}

	public ArrayList<String> importVoorNamen() throws FileNotFoundException {
		voorNamen = new ArrayList<String>(importRegels(voorNamenBestand));
		return voorNamen;
	}

	public ArrayList<String> importAchterNamen() throws FileNotFoundException {
		achterNamen = new ArrayList<String>(importRegels(achterNamenBestand));
		return achterNamen;
	}

	public ArrayList<String> importPlaatsNamen() throws FileNotFoundException {
		plaatsNamen = new ArrayList<String>(importRegels(plaatsNamenBestand));
		return plaatsNamen;
	}

	public ArrayList<String> importStraatNamen() throws FileNotFoundException {
		straatNamen = new ArrayList<String>(importRegels(straatNamenBestand));
		return straatNamen;
	}

	public ArrayList<String> importOpgegevenBestand(File opgegevenBestand)
			throws FileNotFoundException {
		opgegevenBestandInhoud = new ArrayList<String>(importRegels(opgegevenBestand));
		return opgegevenBestandInhoud;
	}

	public ArrayList<String> maakNummerLijst(int aantalCijfers, int min, int max) {
		nummerLijst.clear();
		Random r = new Random();
		for (int i = 0; i < aantalRecords; i++) {
			String nummer = "" + (r.nextInt((max-min) + 1) + min);
			while(nummer.length() < aantalCijfers) {
				nummer = "0" + nummer;
			}
			nummerLijst.add(nummer);
		}
		return nummerLijst;
	}

	public ArrayList<String> maakTelefoonNummers() {
		telefoonNummers.clear();
		Random r = new Random();
		for (int i = 0; i < aantalRecords; i++) {
			String telNr = "035";
			for (int j = 0; j < 7; j++) {
				telNr += r.nextInt(9);
			}
			telefoonNummers.add(telNr);
		}
		return telefoonNummers;
	}

	public ArrayList<String> maakHuisNummers() {
		huisNummers.clear();
		Random r = new Random();
		for (int i = 0; i < aantalRecords; i++) {
			String huisNr = "";
			for (int j = 0; j < (r.nextInt(3) + 1); j++) {
				huisNr += r.nextInt(9);
			}
			huisNummers.add(huisNr);
		}
		return huisNummers;
	}

	public ArrayList<String> maakAdressen() throws FileNotFoundException {
		adressen.clear();
		if (huisNummers == null || huisNummers.size() != aantalRecords) {
			maakHuisNummers();
		}
		if (straatNamen == null || straatNamen.size() != aantalRecords) {
			importStraatNamen();
		}
		for (int i = 0; i < aantalRecords; i++) {
			String adres = straatNamen.get(i) + " " + huisNummers.get(i);
			adressen.add(adres);
		}
		return adressen;
	}

	public ArrayList<String> maakPostcodes() {
		postcodes.clear();
		Random r = new Random();
		for (int i = 0; i < aantalRecords; i++) {
			String postcode = "";
			for (int j = 0; j < 4; j++) {
				postcode += (r.nextInt(8) + 1);
			}
			for (int j = 0; j < 2; j++) {
				postcode += (char) (r.nextInt(26) + 'A');
			}
			postcodes.add(postcode);
		}
		return postcodes;
	}

	// Email adres = voornaam@mail.nl (alles lowercase
	public ArrayList<String> maakEmailAdress() throws FileNotFoundException {
		emailAdressen.clear();
		if (voorNamen == null || voorNamen.size() != aantalRecords) {
			importVoorNamen();
		}
		for (int i = 0; i < aantalRecords; i++) {
			String email = voorNamen.get(i).toLowerCase() + "@mail.nl";
			emailAdressen.add(email);
		}
		return emailAdressen;
	}

	// Gebruikersnaam = eerste letter van voornaam + achternaam (alles
	// lowercase)
	// Wachtwoord = MD5(gebruikersnaam)
	public void maakGebruikers() throws FileNotFoundException, NoSuchAlgorithmException {
		gebruikersNamen.clear();
		wachtwoorden.clear();
		if (voorNamen == null || voorNamen.size() != aantalRecords) {
			importVoorNamen();
		}
		if (achterNamen == null || achterNamen.size() != aantalRecords) {
			importAchterNamen();
		}
		for (int i = 0; i < aantalRecords; i++) {
			String voorLetter = "" + voorNamen.get(i).toLowerCase().charAt(0);
			String achterNaam = achterNamen.get(i).toLowerCase();
			String gN = voorLetter + achterNaam;
			gebruikersNamen.add(gN);
			wachtwoorden.add(md5(gN));
		}
	}

	public ArrayList<String> getGebruikersNamen() throws FileNotFoundException,
			NoSuchAlgorithmException {
		if (gebruikersNamen == null || gebruikersNamen.size() != aantalRecords) {
			maakGebruikers();
		}
		return gebruikersNamen;
	}

	public ArrayList<String> getWachtwoorden() throws FileNotFoundException,
			NoSuchAlgorithmException {
		if (gebruikersNamen == null || gebruikersNamen.size() != aantalRecords) {
			maakGebruikers();
		}
		return wachtwoorden;
	}

	public String md5(String input) throws NoSuchAlgorithmException {
		String result = input;
		if (input != null) {
			MessageDigest md = MessageDigest.getInstance("MD5"); // or "SHA-1"
			md.update(input.getBytes());
			BigInteger hash = new BigInteger(1, md.digest());
			result = hash.toString(16);
			while (result.length() < 32) {
				result = "0" + result;
			}
		}
		return result;
	}

	public ArrayList<String> importRegels(File file) throws FileNotFoundException {
		bestandRegels.clear();
		gevraagdeRegels.clear();
		Scanner scanFile = new Scanner(file);
		scanFile.useDelimiter("\n");

		while (scanFile.hasNext()) {
			bestandRegels.add(scanFile.next());
		}
		scanFile.close();

		int regel = 0;
		for (int i = 0; i < aantalRecords; i++) {
			if (regel >= bestandRegels.size()) {
				regel = 0;
			}
			gevraagdeRegels.add(bestandRegels.get(regel));
			regel++;
		}
		return gevraagdeRegels;
	}
}
